package util;

import java.io.Writer;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 *
 * @author JFM
 */
public class Util
	{
	private static SimpleDateFormat ddMMyyyy = new SimpleDateFormat("dd/MM/yyyy");
	private static SimpleDateFormat ddMMyyyyhh = new SimpleDateFormat("dd/MM/yyyy HH");
	private static SimpleDateFormat ddMMyyyyhhmm = new SimpleDateFormat("dd/MM/yyyy HH:mm");
	private static SimpleDateFormat ddMMyyyyhhmmss = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
	private static SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
	private static SimpleDateFormat yyyyMMddhhmmss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	public static final DecimalFormat porcentaje;
	public static final DecimalFormat numero;
	
	static
		{
		numero = new DecimalFormat("###,###.##");
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
		simbolos.setGroupingSeparator('.');
		simbolos.setDecimalSeparator(',');
		numero.setDecimalFormatSymbols(simbolos);
		
		porcentaje = new DecimalFormat("#0.00;(-#0.00)");
		}

	// Obtiene el mensaje que se muestra por pantalla cuando se llama al metodo 'printStackTrace()'.
	public static String getStackTrace(Throwable throwable)
		{
		Writer writer = new StringWriter();
		PrintWriter printWriter = new PrintWriter(writer);
		throwable.printStackTrace(printWriter);
		return writer.toString();
		}

	public static String format(Date fecha, String formato)
		{
		if(formato != null && fecha != null)
			{
			if(formato.compareTo("dd/MM/yyyy") == 0) return ddMMyyyy.format(fecha);
			if(formato.compareTo("dd/MM/yyyy HH:mm") == 0) return ddMMyyyyhhmm.format(fecha);
			if(formato.compareTo("yyyy-MM-dd") == 0) return yyyyMMdd.format(fecha);
			if(formato.compareTo("yyyy-MM-dd HH:mm:ss") == 0) return yyyyMMddhhmmss.format(fecha);
			return new SimpleDateFormat(formato).format(fecha);
			}
		return "";
		}

	public static boolean notEmpty(String cad)
		{ return cad != null && cad.length() > 0; }
	
	public static Date parseDate(String fecha)
		{
		if(fecha == null || fecha.length() == 0) return null;

		try{ return ddMMyyyy.parse(fecha); }catch(Exception e) {}
		try{ return yyyyMMdd.parse(fecha); }catch(Exception e) {}

		return null;
		}

	public static Date parseDatetime(String fecha)
		{
		if(fecha == null || fecha.length() == 0) return null;

		try{ return yyyyMMddhhmmss.parse(fecha); }catch(Exception e) {}
		try{ return ddMMyyyyhhmmss.parse(fecha); }catch(Exception e) {}
		try{ return ddMMyyyyhhmm.parse(fecha); }catch(Exception e) {}
		try{ return ddMMyyyyhh.parse(fecha); }catch(Exception e) {}
		try{ return ddMMyyyy.parse(fecha); }catch(Exception e) {}

		return null;
		}

	public static Date toMidnight(Date fecha)
		{
		if(fecha != null)
			{ return Util.parseDatetime(Util.format(fecha, "yyyy-MM-dd 00:00:00")); }
		return null;
		}

	public static String formatPorcentaje(float valor)
		{
		String res = "";
		long val = (long)(valor*100);
		
		if(val == 0)
			{ res = "0"; }
		else
			{
			res = val/100 + "";
			val = val%100;
			
			if(val != 0)
				{
				res += "," + val/10;
				if(val%10 != 0) { res += val%10; }
				}
			}
		
		return res;
		}


	public static int parseInt(String entero)
		{
		int res = 0;
		if(entero != null && entero.length() > 0)
			{
			try{
				res = Integer.parseInt(entero);
				}catch(Exception e) {}
			}
		return res;
		}

	public static long parseLong(String entero)
		{
		long res = 0;
		if(entero != null && entero.length() > 0)
			{
			try{
				res = Long.parseLong(entero);
				}catch(Exception e) {}
			}
		return res;
		}

	public static boolean parseBoolean(String valor)
		{ return (valor != null) && (valor.compareTo("1") == 0 || valor.compareToIgnoreCase("true") == 0); }

	public static int diferencia(Date fecha1, Date fecha2)
		{ return diferencia(fecha1, fecha2, "d"); }

	public static int diferencia(Date fecha1, Date fecha2, String unidad)
		{
		long dif = fecha1.getTime() - fecha2.getTime();
		if(dif < 0) dif = - dif;
		
		if(unidad != null)
			{
			if(unidad.compareTo("s")==0) dif /= 1000L;
			if(unidad.compareTo("m")==0) dif /= 60L*1000L;
			if(unidad.compareTo("h")==0) dif /= 3600L*1000L;
			if(unidad.compareTo("d")==0) dif /= 86400000L;
			if(unidad.compareTo("M")==0) dif /= 30L*86400000L;
			if(unidad.compareTo("y")==0) dif /= 365L*86400000L;
			}
		
		return (int) dif;
		}
	
	public static int[] parseIds(String request)
		{ return parseIds(request, ","); }
	
	public static int[] parseIds(String request, String regex)
		{
		int res[];

		if(request != null && regex != null)
			{
			String values[] = request.split(regex);
			res = new int[values.length];
			for(int i=0,n=values.length; i<n; i++)
				{ res[i] = parseInt(values[i]); }			
			}
		else
			{ res = new int[0]; }
		
		return res;
		}
        
        public static Date obtenerInicioDeSemana(Date dia){
            Calendar c = new GregorianCalendar();
            c.setTime(dia);
            int diaDeLaSemana = c.get(Calendar.DAY_OF_WEEK);
            if (diaDeLaSemana == Calendar.SUNDAY){
                diaDeLaSemana = 8;
            }

            //La semana de produccion empieza los lunes
            c.add(Calendar.DATE, -  diaDeLaSemana + 2);
            return c.getTime();
        }
 }
